spring | 您所在的位置:网站首页 › spring boot 异步调用偶尔不生效 › spring |
文末解释原因 注:@Transactional不生效的原因也是 不生效的代码: @Component public class AsycnTest { public void test(){ testAsync(); } @Async public void testAsync(){ } } 解决方案: 方案一、将方法抽离出去,再调用 1、主类 @Component public class AsycnTest { @Autowired private Test test; public void test(){ test.testAsync(); } }2、抽离出去的方法类 @Component public class Test { @Async public void testAsync(){ } }方案二、注入当前类,在用注入的类调用该方法。一定记住加@Lazy注解,防止循环注入 @Component public class AsycnTest { @Lazy @Autowired private AsycnTest asycnTest; public void test(){ asycnTest.testAsync(); } @Async public void testAsync(){ } } 不能调用的原因:1、先看spring怎么实现的:spring 在扫描bean的时候会扫描该类的方法上是否包含 @Async 注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类 proxy),代理类是继承原来那个bean的,并且重写了父类中被 @Async 注解的方法(如果该注解是加在了类上,则会重写该类的所有方法),并利用AOP切面为这些方法加上异步逻辑
2、原因:当这个有注解的方法被调用的时候,实际上调用的是代理类中重写过的方法。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么就不会调用该代理类了,而是直接通过当前对象去调,所以也就不生效了,所以我们看到的现象就是该异步方法没有生效。 |
CopyRight 2018-2019 实验室设备网 版权所有 |